/**
 *
 * @author Valdez
 */

import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Driver {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        
        Scanner readln = new Scanner(System.in);
        boolean salir = false;
        HashMap funciones = new HashMap();
        
        do{
            instrucciones();
            int parentesis = 0;
            boolean error = false;
            String ingreso = readln.nextLine();
            String ingreso2 = "";
            String[] ingresoFinal;
            ingreso = ingreso.toUpperCase();

            for (int i = 0; i< ingreso.length(); i++){
                if (ingreso.charAt(i) == '('){
                    parentesis ++;
                    
                }
                if (ingreso.charAt(i) == ')'){
                    parentesis --;
                }
            }

            error = (parentesis != 0);

            if (error)
                System.out.println("La cantidad de parentesis esta incorrecta");
            else{
                ingresoFinal=ingreso.split(" ");
                boolean finished;
                boolean defun=false;
                do{
                    finished=true;
                    for(int x=0; x<ingresoFinal.length; x++){
                        if(!ingresoFinal[x].isEmpty()){
                            if((ingresoFinal[x].equals("DEFUN"))||((ingresoFinal[x].equals("(DEFUN")))){
                                defun=true;
                                ingresoFinal[x+1]=ingresoFinal[x+1].replace("(", " ( ");
                            }
                            if((ingresoFinal[x].contains("(")))
                                ingreso2+=ingresoFinal[x].replace("(", " ( ")+" ";
                            else
                                ingreso2+=ingresoFinal[x].replace(")", " ) ")+" ";
                        }
                    }

                    ingresoFinal=ingreso2.split(" ");
                    for(int y=0;y<ingresoFinal.length; y++){
                        if((ingresoFinal[y].indexOf("(")!=-1)&&(ingresoFinal[y].length()>1)){
                            finished=false;

                        }
                        if((ingresoFinal[y].indexOf(")")!=-1)&&(ingresoFinal[y].length()>1)){
                            finished=false;
                        }

                    }
                    ingreso2=null;
                    ingreso2="";
                }while(!finished);
                int cont=0;
                for(int x=0; x<ingresoFinal.length;x++){    
                    if(!ingresoFinal[x].isEmpty()){
                        cont++;
                    }
                }
                String[] instrucciones=new String[cont];
                cont=0;
                for(int x=0; x<ingresoFinal.length;x++){    
                    if(!ingresoFinal[x].isEmpty()){
                        instrucciones[cont]=ingresoFinal[x];
                        cont++;
                    }
                }
                if(defun){
                    int indexargs=0;
                    String[] dec;
                    String[] body;
                    for (int x=0;x<instrucciones.length;x++){
                        if(instrucciones[x].equals(")")){
                            indexargs=x;
                            x=instrucciones.length;
                        }
                    }
                    
                    indexargs++;
                    dec=new String[indexargs];

                    for (int z=2;z<indexargs;z++)
                        dec[z-2]=instrucciones[z];

                    body=new String[instrucciones.length-indexargs];
                    for (int z=indexargs;z<instrucciones.length-1;z++){
                        body[z-indexargs]=instrucciones[z];
                    }
                    Funcion funcionNueva = new Funcion(dec, body);
                    funciones.put(funcionNueva.getName(), funcionNueva);
                    System.out.println(funcionNueva.getName());
                }
                else{
                    List lista = new List(instrucciones);
                    System.out.println("El resultado es: "+lista.evaluar());
                }
             }
        }while (!salir);
                
    }
    
    
    /**
     * muestra las instrucciones
     */
    public static void instrucciones(){
        System.out.println("\n+--  INSTRUCCIONES   -------------------------------+");
        System.out.println("| Ha ingresado a la simulacion de un interprete de  |");
        System.out.println("| LISP, introduzca cada funcion siguiendo la        |");
        System.out.println("| sintaxis de LISP, utilice prefix y parentesis para|");
        System.out.println("| cada subfuncion. Para salir introduzca (exit).    |");
        System.out.println("+---------------------------------------------------+\n");
    }
    
    public static int pedirNumero(String texto){
        Scanner readln = new Scanner(System.in);
        boolean pedir;
        int numero = 0;
        do{
            numero = 0;
            pedir = false;
            try{
                    System.out.println(texto);
                    numero = readln.nextInt();
                    pedir = false;
            }
            catch(InputMismatchException exception){
                    pedir = true;
                    System.out.println("\n ERROR --> NUMERO NO VALIDO \n");
            }
        readln.nextLine();
        }while (pedir);
        return numero;
    }
}
